# -*- coding: utf-8 -*-
# @Time    : 2024/7/29 17:55
# @Author  : yujiahao
# @File    : 66_fastapi_root_path.py
# @description:使用代理


"""
1. 有些情况下，您可能要使用 Traefik 或 Nginx 等代理服务器，并添加应用不能识别的附加路径前缀配置。

2. 此时，要使用 root_path 配置应用。

    2.1 root_path 是 ASGI 规范提供的机制，FastAPI 就是基于此规范开发的（通过 Starlette）。

    2.2 root_path 用于处理这些特定情况。

    2.3 在挂载子应用时，也可以在内部使用 root_path。
"""

"""
1. 移除路径前缀的代理

    1.1 定义路径和代理：
        - 在代码中声明路径 /app。
        - 在应用顶层添加代理，把 FastAPI 应用放在 /api/v1 路径下。

    1.2 服务路径：
        - 原始路径 /app 实际上是在 /api/v1/app 提供服务。
        - 所有代码都假设只有 /app。

    1.3 代理行为：
        - 代理在把请求传送给 Uvicorn 之前移除路径前缀。
        - 应用以为它是在 /app 提供服务，因此代码中不需要加入前缀 /api/v1。

    1.4 前端问题：
        - 在前端打开 API 文档时，代理会要求在 /openapi.json 中提取 OpenAPI 概图，而不是 /api/v1/openapi.json。
        - 因此，前端会尝试访问 /openapi.json，但无法获取 OpenAPI 概图。

    1.5 原因：
        - 应用使用了以 /api/v1 为路径前缀的代理，前端需要从 /api/v1/openapi.json 中提取 OpenAPI 概图。
"""

# 演示一下

from fastapi import FastAPI, Request

# app = FastAPI()
# 在 FastAPI 应用里设置 root_path
# 还有一种方案，如果不能提供 --root-path 或等效的命令行选项，则在创建 FastAPI 应用时要设置 root_path 参数。

# 说白了直接在这里就声明了
app = FastAPI(root_path="/api/v1")


@app.get("/app")
def read_main(request: Request):
    return {"message": "Hello World", "root_path": request.scope.get("root_path")}
